package main

import (
	"encoding/json"
	"jlpay-sdk-go/pkg/jlpay/demo"
	"jlpay-sdk-go/pkg/jlpay/models/ledger"
	ledger2 "jlpay-sdk-go/pkg/jlpay/services/ledger"
	"jlpay-sdk-go/pkg/jlpay/utils"
)

// 余额查询示例
func balanceQueryDemo(balanceSplitService *ledger2.BalanceSplitService) {
	// 创建余额查询请求
	request := ledger.NewBalanceQueryRequest()

	// 直接使用map构建请求
	requestMap := map[string]interface{}{
		"org_code":     "50720711",
		"mch_id":       "849584358120018",
		"account_type": "01",
	}

	// 设置原始请求数据
	request.SetRawRequestMap(requestMap)

	// 序列化请求数据并打印
	requestJSON, _ := json.Marshal(requestMap)
	utils.Debugf("余额查询请求数据: %s", string(requestJSON))

	// 发送请求
	response, err := balanceSplitService.QueryBalance(request)
	if err != nil {
		utils.Errorf("余额查询请求失败: %v", err)
		return
	}

	// 处理响应 - 使用BaseResponse接口的HandleResponse方法
	response.HandleResponse("余额查询")
}

// 余额分账示例
func balanceSplitDemo(balanceSplitService *ledger2.BalanceSplitService) {
	// 创建余额分账请求
	request := ledger.NewBalanceSplitRequest()

	// 创建接收方列表
	receivers := []map[string]interface{}{
		{
			"rev_mch_id":  "849584358120019",
			"amount":      "50",
			"description": "分账给商户A",
		},
		{
			"rev_mch_id":  "849584358120020",
			"amount":      "30",
			"description": "分账给商户B",
		},
	}

	// 直接使用map构建请求
	requestMap := map[string]interface{}{
		"org_code":     "50720711",
		"mch_id":       "849584358120018",
		"out_trade_no": "SPLIT20241201001",
		"total_amount": "100",
		"description":  "余额分账测试",
		"receivers":    receivers,
	}

	// 设置原始请求数据
	request.SetRawRequestMap(requestMap)

	// 序列化请求数据并打印
	requestJSON, _ := json.Marshal(requestMap)
	utils.Debugf("余额分账请求数据: %s", string(requestJSON))

	// 发送请求
	response, err := balanceSplitService.SplitBalance(request)
	if err != nil {
		utils.Errorf("余额分账请求失败: %v", err)
		return
	}

	// 处理响应 - 使用BaseResponse接口的HandleResponse方法
	response.HandleResponse("余额分账")
}

// 余额分账查询示例
func balanceSplitQueryDemo(balanceSplitService *ledger2.BalanceSplitService) {
	// 创建余额分账查询请求
	request := ledger.NewBalanceSplitQueryRequest()

	// 直接使用map构建请求
	requestMap := map[string]interface{}{
		"org_code":     "50720711",
		"mch_id":       "849584358120018",
		"out_trade_no": "SPLIT20241201001",
	}

	// 设置原始请求数据
	request.SetRawRequestMap(requestMap)

	// 序列化请求数据并打印
	requestJSON, _ := json.Marshal(requestMap)
	utils.Debugf("余额分账查询请求数据: %s", string(requestJSON))

	// 发送请求
	response, err := balanceSplitService.QueryBalanceSplit(request)
	if err != nil {
		utils.Errorf("余额分账查询请求失败: %v", err)
		return
	}

	// 处理响应 - 使用BaseResponse接口的HandleResponse方法
	response.HandleResponse("余额分账查询")
}

// 余额退款示例
func balanceRefundDemo(balanceSplitService *ledger2.BalanceSplitService) {
	// 创建余额退款请求
	request := ledger.NewBalanceRefundRequest()

	// 直接使用map构建请求
	requestMap := map[string]interface{}{
		"org_code":      "50720711",
		"mch_id":        "849584358120018",
		"out_trade_no":  "REFUND20241201001",
		"refund_amount": "20",
		"description":   "余额退款测试",
	}

	// 设置原始请求数据
	request.SetRawRequestMap(requestMap)

	// 序列化请求数据并打印
	requestJSON, _ := json.Marshal(requestMap)
	utils.Debugf("余额退款请求数据: %s", string(requestJSON))

	// 发送请求
	response, err := balanceSplitService.RefundBalance(request)
	if err != nil {
		utils.Errorf("余额退款请求失败: %v", err)
		return
	}

	// 处理响应 - 使用BaseResponse接口的HandleResponse方法
	response.HandleResponse("余额退款")
}

// 余额退款查询示例
func balanceRefundQueryDemo(balanceSplitService *ledger2.BalanceSplitService) {
	// 创建余额退款查询请求
	request := ledger.NewBalanceRefundQueryRequest()

	// 直接使用map构建请求
	requestMap := map[string]interface{}{
		"org_code":     "50720711",
		"mch_id":       "849584358120018",
		"out_trade_no": "REFUND20241201001",
	}

	// 设置原始请求数据
	request.SetRawRequestMap(requestMap)

	// 序列化请求数据并打印
	requestJSON, _ := json.Marshal(requestMap)
	utils.Debugf("余额退款查询请求数据: %s", string(requestJSON))

	// 发送请求
	response, err := balanceSplitService.QueryBalanceRefund(request)
	if err != nil {
		utils.Errorf("余额退款查询请求失败: %v", err)
		return
	}

	// 处理响应 - 使用BaseResponse接口的HandleResponse方法
	response.HandleResponse("余额退款查询")
}

func main() {
	// 设置日志级别为info，显示详细的调试信息
	utils.SetLogLevel("info")

	utils.Info("=============================")
	utils.Info("===== 余额分账模块示例 开始 =====")
	utils.Info("=============================")

	// 创建配置对象和余额分账服务
	config := demo.CreateDemoConfig()
	balanceSplitService := ledger2.NewBalanceSplitService(config)

	// 执行所有示例
	utils.Info("")
	utils.Info("=============================")
	utils.Info("===== 余额查询示例 开始 =====")
	utils.Info("=============================")
	balanceQueryDemo(balanceSplitService)

	utils.Info("")
	utils.Info("=============================")
	utils.Info("===== 余额分账示例 开始 =====")
	utils.Info("=============================")
	balanceSplitDemo(balanceSplitService)

	utils.Info("")
	utils.Info("=============================")
	utils.Info("===== 余额分账查询示例 开始 =====")
	utils.Info("=============================")
	balanceSplitQueryDemo(balanceSplitService)

	utils.Info("")
	utils.Info("=============================")
	utils.Info("===== 余额退款示例 开始 =====")
	utils.Info("=============================")
	balanceRefundDemo(balanceSplitService)

	utils.Info("")
	utils.Info("=============================")
	utils.Info("===== 余额退款查询示例 开始 =====")
	utils.Info("=============================")
	balanceRefundQueryDemo(balanceSplitService)

	utils.Info("")
	utils.Info("=============================")
	utils.Info("===== 余额分账模块示例执行完毕 =====")
	utils.Info("=============================")
}
